import { COLOR } from 'src/utils/color';
import { isEqual } from 'lodash';
const COMPARE_NOT_FOUNT = 'COMPARE_NOT_FOUNT'; //表示值不存在的常量


function findThisValue(obj, keys, i) {
  if (!keys.length) return JSON.stringify(obj); // 临时方案 兼容checkbox-group 对比(id as number)[]
  const cur = obj[keys[i]];
  if (cur !== undefined) {
    if (i >= keys.length - 1) {
      return cur;
    }
    i++;
    return findThisValue(cur, keys, i);
    //如果找不到，则返回COMPARE_NOT_FOUNT标识
  } else {
    return COMPARE_NOT_FOUNT;
  }
}
/**
 * @method compare
 * @param {*} props
 * @param {*} keys
 * @return {Object} style
 */
export function compare(props, ...keys) {
  // 如果不是对比
  if (!props.isCompare) {
    return null;
  }
  if (!props.value || Object.keys(props.value).length === 0) {
    return null;
  }
  // 如果对比的数据不存在
  if (!props.compareData) {
    // 如果当前是老数据，则直接返回红色（删除）
    if (props.isOld) {
      return { color: COLOR._RED };

      // 如果是新数据，则是蓝色(新增)
    } else {
      return { color: COLOR._BLUE };
    }
  }

  let curValue = ''
  let compareValue = ''
  if (props.isArray) {
    curValue = JSON.stringify(props.value);
    compareValue = JSON.stringify(props.compareData);
  } else {
    curValue = findThisValue(props.value, keys, 0);
    compareValue = findThisValue(props.compareData, keys, 0);
  }
  // 如果是旧数据
  if (props.isOld) {
    // 当前数据存在，对比的不存在，则是删除
    if (curValue !== COMPARE_NOT_FOUNT && compareValue === COMPARE_NOT_FOUNT) {
      return { color: COLOR._RED };
    }

    // 都存在且不一样，才是修改 
    if (!isEqual(curValue, compareValue)) {
      return { color: COLOR._BLUE };
    }
    // 如果是新数据，不管怎么样都是修改
  } else {
    if (curValue !== COMPARE_NOT_FOUNT && compareValue === COMPARE_NOT_FOUNT) {
      return { color: COLOR._BLUE };
    }
    if (!isEqual(curValue, compareValue)) {
      return { color: COLOR._BLUE };
    }
  }
}

/**
 * @method compareClass
 * @param {*} props
 * @param {*} keys
 * @return {Object} class 样式名，
 */
export function compareClass(props, ...keys) {
  // 如果不是对比
  if (!props.isCompare) {
    return null;
  }
  if (!props.value || Object.keys(props.value).length === 0) {
    return null;
  }
  // 如果对比的数据不存在
  if (!props.compareData) {
    // 如果当前是老数据，则直接返回红色（删除）
    if (props.isOld) {
      return 'compare-red';

      // 如果是新数据，则是蓝色(新增)
    } else {
      return 'compare-blue';
    }
  }

  const curValue = findThisValue(props.value, keys, 0);
  const compareValue = findThisValue(props.compareData, keys, 0);
  // 如果是旧数据
  if (props.isOld) {
    if (curValue !== COMPARE_NOT_FOUNT && compareValue === COMPARE_NOT_FOUNT) {
      return 'compare-red';
    }
    // 都存在且不一样，才是修改
    if (!isEqual(curValue, compareValue)) {
      return 'compare-blue';
    }
    // 如果是新数据，不管怎么样都是修改
  } else {
    if (curValue !== COMPARE_NOT_FOUNT && compareValue === COMPARE_NOT_FOUNT) {
      return 'compare-blue';
    }
    if (!isEqual(curValue, compareValue)) {
      return 'compare-blue';
    }
  }
}

/**
 * @method compareStatus
 * @param {*} props
 * @param {*} keys
 * @return {Object} class 样式名，
 */
export function compareStatus(props, ...keys) {
  // 如果不是对比
  if (!props.isCompare) {
    return null;
  }
  if (!props.value || Object.keys(props.value).length === 0) {
    return null;
  }
  // 如果对比的数据不存在
  if (!props.compareData) {
    // 如果当前是老数据，则直接返回红色（删除）
    if (props.isOld) {
      return 'delete';

      // 如果是新数据，则是蓝色(新增)
    } else {
      return 'add';
    }
  }

  const curValue = findThisValue(props.value, keys, 0);
  const compareValue = findThisValue(props.compareData, keys, 0);

  // 如果是旧数据
  if (props.isOld) {
    // 当前数据存在，对比的不存在，则是删除
    if (curValue !== COMPARE_NOT_FOUNT && compareValue === COMPARE_NOT_FOUNT) {
      return 'delete';
    }

    // 都存在且不一样，才是修改
    if (!isEqual(curValue, compareValue)) {
      return 'update';
    }
    // 如果是新数据，不管怎么样都是修改
  } else {
    if (curValue !== COMPARE_NOT_FOUNT && compareValue === COMPARE_NOT_FOUNT) {
      return 'add';
    }
    if (!isEqual(curValue, compareValue)) {
      return 'update';
    }
  }
}
